package com.lsh.threadpool;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author ：LiuShihao
 * @date ：Created in 2020/12/17 3:45 下午
 * @desc ： 使用ThreadPoolExecutor创建线程池
 * 在阿里巴巴Java开发手册中提到，使用Executors创建线程池可能会导致OOM(OutOfMemory ,内存溢出)
 */
public class CreateThreadPoolExecutor {
    public static void main(String[] args) {
        /**
         * corePoolSize     线程池核心线程数量  10
         * maximumPoolSize  线程池最大数量     15
         * keepAliveTime    空闲线程存活时间   60秒
         * unit => 时间单位
         * workQueue => 线程池所使用的缓冲队列
         * threadFactory => 线程池创建线程使用的工厂
         * handler => 线程池对拒绝任务的处理策略
         *
         */
        ExecutorService executor = new ThreadPoolExecutor(10, 15,60L, TimeUnit.SECONDS, new ArrayBlockingQueue(10));
        for (int i = 0; i < 20; i++) {
            int nun = i;
            executor.execute(() ->{
                System.out.println(Thread.currentThread().getName()+"    "+nun);
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
        executor.shutdown();

    }
}
